package com.gitee.alg.sort

/**
 * Project Name: alg
 * Des:冒泡排序算法
 * 算法步骤
 *    比较相邻的元素。如果第一个比第二个大，就交换他们两个。
 *    对每一对相邻元素作同样的工作，从开始第一对到结尾的最后一对。这步做完后，最后的元素会是最大的数。
 *    针对所有的元素重复以上的步骤，除了最后一个。
 *    持续每次对越来越少的元素重复上面的步骤，直到没有任何一对数字需要比较。
 * Package:com.gitee.alg.sort
 * @author Arlo Sun
 * @date 2021/4/26 - 13:06
 */
class BubbleSort<T : Comparable<T>>(override val compare: (T, T) -> Boolean) : ArraySort<T> {

    override fun sort(array: Array<T>, ascend: Boolean): Array<T> {

        for (i in 1 until array.size) {

            var sorted = true

            for (j in 0 until array.size - i) {
                if (compare(array[j], array[j + 1])) {
                    array.swap(j, j + 1)
                    sorted = false
                }
            }

            //如果数组已经有序（没有泡泡了），就可以提前结束了
            if (sorted) {
                break
            }

        }
        return array
    }
}